package com.ch.engine.daily.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * bean生命周期
 * 🔍 1.1 postProcessBeforeInstantiation()
 * 🚧 2.1 构造方法执行 FullLifecycleBean()
 * 🔍 3.1 postProcessAfterInstantiation()
 * 🔍 4.1 postProcessProperties()
 * 🔧 5.1 BeanNameAware.setBeanName: fullLifecycleBean
 * 🔧 5.2 BeanFactoryAware.setBeanFactory
 * 🔧 5.3 ApplicationContextAware.setApplicationContext
 * 🛠️ 6.1 postProcessBeforeInitialization()
 * ✅ 7.1 @PostConstruct 初始化方法
 * ✅ 7.2 InitializingBean.afterPropertiesSet()
 * ✅ 7.3 自定义 init-method()
 * 🛠️ 8.1 postProcessAfterInitialization()
 * 🔹 9.1 Bean 使用阶段（由业务代码驱动）
 * ❌ 10.1 @PreDestroy 销毁前调用
 * ❌ 10.2 DisposableBean.destroy()
 * ❌ 10.3 自定义 destroy-method()
 *
 * @author wangchunhui
 * @date 2025/7/29 9:29
 */
public class FullLifecycleBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

    /*
    1. 实例化前阶段（Instantiation-aware）
        1.1 postProcessBeforeInstantiation()
    2. Bean 实例化
        2.1 执行构造方法（new FullLifecycleBean()）
    3. 实例化后阶段
        3.1 postProcessAfterInstantiation()
    4. 属性注入阶段（依赖注入）
        4.1 postProcessProperties()
        4.2 属性自动注入（如 @Autowired）
    5. Aware 接口回调
        5.1 BeanNameAware.setBeanName()
        5.2 BeanFactoryAware.setBeanFactory()
        5.3 ApplicationContextAware.setApplicationContext()
    6. 初始化前处理（Initialization-aware）
        6.1 postProcessBeforeInitialization()
    7. 初始化阶段
        7.1 @PostConstruct 方法执行
        7.2 InitializingBean.afterPropertiesSet()
        7.3 自定义 init-method（如果配置了）
    8. 初始化后处理
        8.1 postProcessAfterInitialization()
    9. 使用阶段（业务使用）
        9.1 Bean 被注入其他对象中
        9.2 开始参与业务逻辑
    10. 销毁阶段（容器关闭或手动销毁）
        10.1 @PreDestroy 方法执行
        10.2 DisposableBean.destroy()
        10.3 自定义 destroy-method（如果配置了）
    */

    public FullLifecycleBean() {
        System.out.println("🚧 2.1 构造方法执行 FullLifecycleBean()");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("🔧 5.1 BeanNameAware.setBeanName: " + name);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("🔧 5.2 BeanFactoryAware.setBeanFactory");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("🔧 5.3 ApplicationContextAware.setApplicationContext");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("✅ 7.1 @PostConstruct 初始化方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("✅ 7.2 InitializingBean.afterPropertiesSet()");
    }

    public void customInit() {
        System.out.println("✅ 7.3 自定义 init-method()");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("❌ 10.1 @PreDestroy 销毁前调用");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("❌ 10.2 DisposableBean.destroy()");
    }

    public void customDestroy() {
        System.out.println("❌ 10.3 自定义 destroy-method()");
    }
}
